JavaScriptμ import λ¨κ³μ λν μ¬μΈ΅ λΆμμΌλ‘, λͺ¨λ λ‘λ© μ λ΅, λͺ¨λ² μ¬λ‘ λ° μ΅μ ν κΈ°μ μ λ€λ£Ήλλ€.
JavaScript Import λ¨κ³: λͺ¨λ λ‘λ© μ μ΄ λ§μ€ν°νκΈ°
JavaScriptμ λͺ¨λ μμ€ν μ νλ μΉ κ°λ°μ κΈ°λ³Έμ λλ€. λͺ¨λμ΄ λ‘λ, νμ± λ° μ€νλλ λ°©μμ μ΄ν΄νλ κ²μ ν¨μ¨μ μ΄κ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λμμλ JavaScript import λ¨κ³λ₯Ό νμνμ¬ λͺ¨λ λ‘λ© μ λ΅, λͺ¨λ² μ¬λ‘ λ° μ±λ₯ μ΅μ ν λ° μ’ μμ± κ΄λ¦¬λ₯Ό μν κ³ κΈ κΈ°μ μ λ€λ£Ήλλ€.
JavaScript λͺ¨λμ΄λ 무μμ λκΉ?
JavaScript λͺ¨λμ κΈ°λ₯μ μΊ‘μννκ³ ν΄λΉ κΈ°λ₯μ νΉμ λΆλΆμ λ€λ₯Έ λͺ¨λμμ μ¬μ©ν μ μλλ‘ λ ΈμΆνλ μ체 ν¬ν¨ μ½λ λ¨μμ λλ€. μ΄λ μ½λ μ¬μ¬μ©μ±, λͺ¨λμ± λ° μ μ§ κ΄λ¦¬ κ°λ₯μ±μ ν₯μμν΅λλ€. λͺ¨λ μ΄μ μλ JavaScript μ½λκ° μ’ μ’ ν° λ¨μΌ νμΌλ‘ μμ±λμ΄ λ€μμ€νμ΄μ€ μ€μΌ, μ½λ μ€λ³΅ λ° μ’ μμ± κ΄λ¦¬μ μ΄λ €μμ κ²ͺμμ΅λλ€. λͺ¨λμ μ½λλ₯Ό ꡬμ±νκ³ κ³΅μ νλ λͺ ννκ³ κ΅¬μ‘°νλ λ°©λ²μ μ 곡νμ¬ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
JavaScript μμ¬μλ μ¬λ¬ λͺ¨λ μμ€ν μ΄ μμ΅λλ€.
- CommonJS: μ£Όλ‘ Node.jsμμ μ¬μ©λλ©°, CommonJSλ
require()λ°module.exportsꡬ문μ μ¬μ©ν©λλ€. - λΉλκΈ° λͺ¨λ μ μ (AMD): λΈλΌμ°μ μμ λΉλκΈ° λ‘λ©μ μν΄ μ€κ³λμμΌλ©°, AMDλ
define()κ³Ό κ°μ ν¨μλ₯Ό μ¬μ©νμ¬ λͺ¨λκ³Ό ν΄λΉ μ’ μμ±μ μ μν©λλ€. - ECMAScript λͺ¨λ (ES λͺ¨λ): ECMAScript 2015 (ES6)μμ λμ
λ νμ€νλ λͺ¨λ μμ€ν
μΌλ‘,
importλ°exportꡬ문μ μ¬μ©ν©λλ€. μ΄λ μ΅μ νμ€μ΄λ©° λλΆλΆμ λΈλΌμ°μ μ Node.jsμμ κΈ°λ³Έμ μΌλ‘ μ§μλ©λλ€.
Import λ¨κ³: μ¬μΈ΅ λΆμ
import λ¨κ³λ JavaScript νκ²½ (μ: λΈλΌμ°μ λλ Node.js)μ΄ λͺ¨λμ μ°Ύκ³ , κ²μνκ³ , νμ±νκ³ , μ€ννλ νλ‘μΈμ€μ λλ€. μ΄ νλ‘μΈμ€μλ λͺ κ°μ§ μ£Όμ λ¨κ³κ° ν¬ν¨λ©λλ€.
1. λͺ¨λ ν΄μ
λͺ¨λ ν΄μμ λͺ¨λ μ§μ μ (import λ¬Έμ μ¬μ©λ λ¬Έμμ΄)λ₯Ό κΈ°λ°μΌλ‘ λͺ¨λμ 물리μ μμΉλ₯Ό μ°Ύλ νλ‘μΈμ€μ
λλ€. μ΄λ νκ²½ λ° μ¬μ© μ€μΈ λͺ¨λ μμ€ν
μ λ°λΌ λ¬λΌμ§λ 볡μ‘ν νλ‘μΈμ€μ
λλ€. λ€μμ λΆμμ
λλ€.
- Bare λͺ¨λ μ§μ μ: μ΄λ κ²½λ‘κ° μλ λͺ¨λ μ΄λ¦μ
λλ€ (μ:
import React from 'react'). νκ²½μ 미리 μ μλ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ΄λ¬ν λͺ¨λμ κ²μνλ©°, μΌλ°μ μΌλ‘node_modulesλλ ν°λ¦¬λ₯Ό μ°Ύκ±°λ λΉλ λꡬμμ ꡬμ±λ λͺ¨λ λ§΅μ μ¬μ©ν©λλ€. - μλ λͺ¨λ μ§μ μ: μ΄λ νμ¬ λͺ¨λμ κΈ°μ€μΌλ‘ κ²½λ‘λ₯Ό μ§μ ν©λλ€ (μ:
import utils from './utils.js'). νκ²½μ νμ¬ λͺ¨λμ μμΉλ₯Ό κΈ°μ€μΌλ‘ μ΄λ¬ν κ²½λ‘λ₯Ό ν΄μν©λλ€. - μ λ λͺ¨λ μ§μ μ: μ΄λ λͺ¨λμ μ 체 κ²½λ‘λ₯Ό μ§μ ν©λλ€ (μ:
import config from '/path/to/config.js'). μ΄λ λ μΌλ°μ μ΄μ§λ§ νΉμ μν©μμ μ μ©ν μ μμ΅λλ€.
μ (Node.js): Node.jsμμ λͺ¨λ ν΄μ μκ³ λ¦¬μ¦μ λ€μ μμλ‘ λͺ¨λμ κ²μν©λλ€.
- μ½μ΄ λͺ¨λ (μ:
fs,http). - νμ¬ λλ ν°λ¦¬μ
node_modulesλλ ν°λ¦¬μ μλ λͺ¨λ. - μμ λλ ν°λ¦¬μ
node_modulesλλ ν°λ¦¬μ μλ λͺ¨λ (μ¬κ·μ μΌλ‘). - κΈλ‘λ²
node_modulesλλ ν°λ¦¬μ μλ λͺ¨λ (ꡬμ±λ κ²½μ°).
μ (λΈλΌμ°μ ): λΈλΌμ°μ μμ λͺ¨λ ν΄μμ μΌλ°μ μΌλ‘ λͺ¨λ λ²λ€λ¬ (μ: Webpack, Parcel λλ Rollup) λλ import λ§΅μ μ¬μ©νμ¬ μ²λ¦¬λ©λλ€. Import λ§΅μ μ¬μ©νλ©΄ λͺ¨λ μ§μ μμ ν΄λΉ URL κ°μ λ§€νμ μ μν μ μμ΅λλ€.
2. λͺ¨λ κ°μ Έμ€κΈ°
λͺ¨λμ μμΉκ° ν΄μλλ©΄ νκ²½μ λͺ¨λμ μ½λλ₯Ό κ°μ Έμ΅λλ€. λΈλΌμ°μ μμ μ΄λ μΌλ°μ μΌλ‘ μλ²μ HTTP μμ²μ 보λ΄λ κ²μ ν¬ν¨ν©λλ€. Node.jsμμ μ΄λ λμ€ν¬μμ λͺ¨λμ νμΌμ μ½λ κ²μ ν¬ν¨ν©λλ€.
μ (ES λͺ¨λμ΄ μλ λΈλΌμ°μ ):
<script type="module">
import { myFunction } from './my-module.js';
myFunction();
</script>
λΈλΌμ°μ λ μλ²μμ my-module.jsλ₯Ό κ°μ Έμ΅λλ€.
3. λͺ¨λ νμ±
λͺ¨λμ μ½λλ₯Ό κ°μ Έμ¨ ν νκ²½μ μ½λλ₯Ό νμ±νμ¬ μΆμ ꡬ문 νΈλ¦¬ (AST)λ₯Ό λ§λλλ€. μ΄ ASTλ μ½λμ ꡬ쑰λ₯Ό λνλ΄λ©° μΆκ° μ²λ¦¬μ μ¬μ©λ©λλ€. νμ± νλ‘μΈμ€λ μ½λκ° κ΅¬λ¬Έμ μΌλ‘ μ¬λ°λ₯΄κ³ JavaScript μΈμ΄ μ¬μμ μ€μνλμ§ νμΈν©λλ€.
4. λͺ¨λ μ°κ²°
λͺ¨λ μ°κ²°μ λͺ¨λ κ°μ importλ κ°κ³Ό exportλ κ°μ μ°κ²°νλ νλ‘μΈμ€μ λλ€. μ¬κΈ°μλ λͺ¨λμ exportsμ importνλ λͺ¨λμ imports κ°μ λ°μΈλ©μ λ§λλ κ²μ΄ ν¬ν¨λ©λλ€. μ°κ²° νλ‘μΈμ€λ λͺ¨λμ΄ μ€νλ λ μ¬λ°λ₯Έ κ°μ μ¬μ©ν μ μλλ‘ λ³΄μ₯ν©λλ€.
μ:
// my-module.js
export const myVariable = 42;
// main.js
import { myVariable } from './my-module.js';
console.log(myVariable); // μΆλ ₯: 42
μ°κ²°νλ λμ νκ²½μ my-module.jsμ myVariable exportλ₯Ό main.jsμ myVariable importμ μ°κ²°ν©λλ€.
5. λͺ¨λ μ€ν
λ§μ§λ§μΌλ‘ λͺ¨λμ΄ μ€νλ©λλ€. μ¬κΈ°μλ λͺ¨λμ μ½λλ₯Ό μ€ννκ³ ν΄λΉ μνλ₯Ό μ΄κΈ°ννλ κ²μ΄ ν¬ν¨λ©λλ€. λͺ¨λμ μ€ν μμλ ν΄λΉ μ’ μμ±μ λ°λΌ κ²°μ λ©λλ€. λͺ¨λμ μμ μμλ‘ μ€νλμ΄ μ’ μμ±μ΄ μλ λͺ¨λλ³΄λ€ λ¨Όμ μ’ μμ±μ΄ μ€νλλλ‘ ν©λλ€.
Import λ¨κ³ μ μ΄: μ λ΅ λ° κΈ°μ
import λ¨κ³λ λλΆλΆ μλνλμ΄ μμ§λ§ λͺ¨λ λ‘λ© νλ‘μΈμ€λ₯Ό μ μ΄νκ³ μ΅μ ννλ λ° μ¬μ©ν μ μλ μ¬λ¬ μ λ΅κ³Ό κΈ°μ μ΄ μμ΅λλ€.
1. λμ Imports
λμ imports (import() ν¨μ μ¬μ©)λ₯Ό μ¬μ©νλ©΄ λͺ¨λμ λΉλκΈ°μ μΌλ‘ κ·Έλ¦¬κ³ μ‘°κ±΄λΆλ‘ λ‘λν μ μμ΅λλ€. μ΄λ λ€μκ³Ό κ°μ κ²½μ°μ μ μ©ν μ μμ΅λλ€.
- μ½λ λΆν : μ ν리μΌμ΄μ μ νΉμ λΆλΆμ νμν μ½λλ§ λ‘λν©λλ€.
- μ‘°κ±΄λΆ λ‘λ©: μ¬μ©μ μνΈ μμ© λλ κΈ°ν λ°νμ 쑰건μ κΈ°λ°μΌλ‘ λͺ¨λμ λ‘λν©λλ€.
- μ§μ° λ‘λ©: μ€μ λ‘ νμν λκΉμ§ λͺ¨λ λ‘λ©μ μ°κΈ°ν©λλ€.
μ:
async function loadModule() {
try {
const module = await import('./my-module.js');
module.myFunction();
} catch (error) {
console.error('λͺ¨λ λ‘λ μ€ν¨:', error);
}
}
loadModule();
λμ importsλ λͺ¨λμ exportsλ‘ νμΈλλ Promiseλ₯Ό λ°νν©λλ€. μ΄λ₯Ό ν΅ν΄ λ‘λ© νλ‘μΈμ€λ₯Ό λΉλκΈ°μ μΌλ‘ μ²λ¦¬νκ³ μ€λ₯λ₯Ό μ μμ μΌλ‘ μ²λ¦¬ν μ μμ΅λλ€.
2. λͺ¨λ λ²λ€λ¬
λͺ¨λ λ²λ€λ¬ (μ: Webpack, Parcel λ° Rollup)λ μ¬λ¬ JavaScript λͺ¨λμ λ°°ν¬λ₯Ό μν΄ λ¨μΌ νμΌ (λλ μ μ μμ νμΌ)λ‘ κ²°ν©νλ λꡬμ λλ€. μ΄λ HTTP μμ² μλ₯Ό μ€μ΄κ³ λΈλΌμ°μ μ λ§κ² μ½λλ₯Ό μ΅μ ννμ¬ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
λͺ¨λ λ²λ€λ¬μ μ₯μ :
- μ’ μμ± κ΄λ¦¬: λ²λ€λ¬λ λͺ¨λμ λͺ¨λ μ’ μμ±μ μλμΌλ‘ νμΈνκ³ ν¬ν¨ν©λλ€.
- μ½λ μ΅μ ν: λ²λ€λ¬λ μ΅μν, νΈλ¦¬ μμ΄νΉ (μ¬μ©νμ§ μλ μ½λ μ κ±°) λ° μ½λ λΆν κ³Ό κ°μ λ€μν μ΅μ νλ₯Ό μνν μ μμ΅λλ€.
- μμ° κ΄λ¦¬: λ²λ€λ¬λ CSS, μ΄λ―Έμ§ λ° κΈκΌ΄κ³Ό κ°μ λ€λ₯Έ μ νμ μμ°λ μ²λ¦¬ν μ μμ΅λλ€.
μ (Webpack ꡬμ±):
// webpack.config.js
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
mode: 'production',
};
μ΄ κ΅¬μ±μ Webpackμκ² ./src/index.jsμμ λ²λ€λ§μ μμνκ³ κ²°κ³Όλ₯Ό ./dist/bundle.jsμ μΆλ ₯νλλ‘ μ§μν©λλ€.
3. νΈλ¦¬ μμ΄νΉ
νΈλ¦¬ μμ΄νΉμ λͺ¨λ λ²λ€λ¬μμ μ΅μ’ λ²λ€μμ μ¬μ©νμ§ μλ μ½λλ₯Ό μ κ±°νλ λ° μ¬μ©λλ κΈ°μ μ λλ€. μ΄λ λ²λ€ ν¬κΈ°λ₯Ό ν¬κ² μ€μ΄κ³ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. νΈλ¦¬ μμ΄νΉμ μ½λμ μ μ λΆμμ ν΅ν΄ λ€λ₯Έ λͺ¨λμμ μ€μ λ‘ μ¬μ©λλ exportsλ₯Ό κ²°μ ν©λλ€.
μ:
// my-module.js
export const myFunction = () => { console.log('myFunction'); };
export const myUnusedFunction = () => { console.log('myUnusedFunction'); };
// main.js
import { myFunction } from './my-module.js';
myFunction();
μ΄ μμμ myUnusedFunctionμ main.jsμμ μ¬μ©λμ§ μμ΅λλ€. νΈλ¦¬ μμ΄νΉμ΄ νμ±νλ λͺ¨λ λ²λ€λ¬λ μ΅μ’
λ²λ€μμ myUnusedFunctionμ μ κ±°ν©λλ€.
4. μ½λ λΆν
μ½λ λΆν μ μ ν리μΌμ΄μ μ μ½λλ₯Ό νμμ λ°λΌ λ‘λν μ μλ λ μμ μ²ν¬λ‘ λλλ κΈ°μ μ λλ€. μ΄λ μ΄κΈ° λ·°μ νμν μ½λλ§ λ‘λνμ¬ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
μ½λ λΆν μ ν:
- μ§μ μ λΆν : μ ν리μΌμ΄μ μ μ¬λ¬ μ§μ μ μΌλ‘ λΆν νκ³ κ° μ§μ μ μ λ€λ₯Έ νμ΄μ§ λλ κΈ°λ₯μ ν΄λΉν©λλ€.
- λμ Imports: λμ importsλ₯Ό μ¬μ©νμ¬ λͺ¨λμ νμμ λ°λΌ λ‘λν©λλ€.
μ (λμ Importsκ° μλ Webpack):
// index.js
button.addEventListener('click', async () => {
const module = await import('./my-module.js');
module.myFunction();
});
Webpackμ my-module.jsμ λν λ³λμ μ²ν¬λ₯Ό λ§λ€κ³ λ²νΌμ ν΄λ¦ν λλ§ λ‘λν©λλ€.
5. Import λ§΅
Import λ§΅μ λͺ¨λ μ§μ μμ ν΄λΉ URL κ°μ λ§€νμ μ μνμ¬ λͺ¨λ ν΄μμ μ μ΄ν μ μλ λΈλΌμ°μ κΈ°λ₯μ λλ€. μ΄λ λ€μκ³Ό κ°μ κ²½μ°μ μ μ©ν μ μμ΅λλ€.
- μ€μ μ§μ€μ μ’ μμ± κ΄λ¦¬: λͺ¨λ λͺ¨λ λ§€νμ λ¨μΌ μμΉμ μ μν©λλ€.
- λ²μ κ΄λ¦¬: λͺ¨λμ λ€λ₯Έ λ²μ κ°μ μ½κ² μ νν©λλ€.
- CDN μ¬μ©: CDNμμ λͺ¨λμ λ‘λν©λλ€.
μ:
<script type="importmap">
{
"imports": {
"react": "https://cdn.jsdelivr.net/npm/react@17.0.2/umd/react.production.min.js",
"react-dom": "https://cdn.jsdelivr.net/npm/react-dom@17.0.2/umd/react-dom.production.min.js"
}
}
</script>
<script type="module">
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
</script>
μ΄ import λ§΅μ λΈλΌμ°μ μκ² μ§μ λ CDNμμ React λ° ReactDOMμ λ‘λνλλ‘ μ§μν©λλ€.
6. λͺ¨λ 미리 λ‘λ
λͺ¨λμ 미리 λ‘λνλ©΄ μ€μ λ‘ νμνκΈ° μ μ λͺ¨λμ κ°μ Έμ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. μ΄λ λͺ¨λμ΄ κ²°κ΅ importλ λ λͺ¨λμ λ‘λνλ λ° κ±Έλ¦¬λ μκ°μ μ€μΌ μ μμ΅λλ€.
μ (<link rel="preload"> μ¬μ©):
<link rel="preload" href="/my-module.js" as="script">
μ΄λ λΈλΌμ°μ μκ² μ€μ λ‘ importλκΈ° μ μλ κ°λ₯ν ν 빨리 my-module.jsλ₯Ό κ°μ Έμ€κΈ° μμνλλ‘ μ§μν©λλ€.
λͺ¨λ λ‘λ©μ μν λͺ¨λ² μ¬λ‘
λͺ¨λ λ‘λ© νλ‘μΈμ€λ₯Ό μ΅μ ννκΈ° μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
- ES λͺ¨λ μ¬μ©: ES λͺ¨λμ JavaScriptμ λν νμ€νλ λͺ¨λ μμ€ν μ΄λ©° μ΅κ³ μ μ±λ₯κ³Ό κΈ°λ₯μ μ 곡ν©λλ€.
- λͺ¨λ λ²λ€λ¬ μ¬μ©: λͺ¨λ λ²λ€λ¬λ HTTP μμ² μλ₯Ό μ€μ΄κ³ μ½λλ₯Ό μ΅μ ννμ¬ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
- νΈλ¦¬ μμ΄νΉ νμ±ν: νΈλ¦¬ μμ΄νΉμ μ¬μ©νμ§ μλ μ½λλ₯Ό μ κ±°νμ¬ λ²λ€ ν¬κΈ°λ₯Ό μ€μΌ μ μμ΅λλ€.
- μ½λ λΆν μ¬μ©: μ½λ λΆν μ μ΄κΈ° λ·°μ νμν μ½λλ§ λ‘λνμ¬ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ ν₯μμν¬ μ μμ΅λλ€.
- Import λ§΅ μ¬μ©: Import λ§΅μ μ’ μμ± κ΄λ¦¬λ₯Ό λ¨μννκ³ λͺ¨λμ λ€λ₯Έ λ²μ κ°μ μ½κ² μ νν μ μλλ‘ ν©λλ€.
- λͺ¨λ 미리 λ‘λ: λͺ¨λμ 미리 λ‘λνλ©΄ λͺ¨λμ΄ κ²°κ΅ importλ λ λͺ¨λμ λ‘λνλ λ° κ±Έλ¦¬λ μκ°μ μ€μΌ μ μμ΅λλ€.
- μ’ μμ± μ΅μν: λͺ¨λμ μ’ μμ± μλ₯Ό μ€μ¬ λ²λ€ ν¬κΈ°λ₯Ό μ€μ λλ€.
- μ’ μμ± μ΅μ ν: μ’ μμ±μ μ΅μ νλ λ²μ (μ: μ΅μνλ λ²μ )μ μ¬μ©ν©λλ€.
- μ±λ₯ λͺ¨λν°λ§: λͺ¨λ λ‘λ© νλ‘μΈμ€μ μ±λ₯μ μ κΈ°μ μΌλ‘ λͺ¨λν°λ§νκ³ κ°μ ν μμμ μλ³ν©λλ€.
μ€μ μ
μ΄λ¬ν κΈ°μ μ΄ μ μ©λ μ μλ λͺ κ°μ§ μ€μ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
1. μ μ μκ±°λ μΉμ¬μ΄νΈ
μ μ μκ±°λ μΉμ¬μ΄νΈλ μ½λ λΆν μ μ¬μ©νμ¬ μΉμ¬μ΄νΈμ λ€λ₯Έ λΆλΆμ νμμ λ°λΌ λ‘λν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ ν λͺ©λ‘ νμ΄μ§, μ ν μΈλΆ μ 보 νμ΄μ§ λ° κ²°μ νμ΄μ§λ₯Ό λ³λμ μ²ν¬λ‘ λ‘λν μ μμ΅λλ€. λμ importsλ μ ν 리뷰λ₯Ό μ²λ¦¬νκΈ° μν λͺ¨λ λλ κ²°μ κ²μ΄νΈμ¨μ΄μ ν΅ν©νκΈ° μν λͺ¨λκ³Ό κ°μ΄ νΉμ νμ΄μ§μμλ§ νμν λͺ¨λμ λ‘λνλ λ° μ¬μ©ν μ μμ΅λλ€.
νΈλ¦¬ μμ΄νΉμ μ¬μ©νμ¬ μΉμ¬μ΄νΈμ JavaScript λ²λ€μμ μ¬μ©νμ§ μλ μ½λλ₯Ό μ κ±°ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ νΉμ κ΅¬μ± μμ λλ ν¨μκ° ν νμ΄μ§μμλ§ μ¬μ©λλ κ²½μ° λ€λ₯Έ νμ΄μ§μ λ²λ€μμ μ κ±°ν μ μμ΅λλ€.
미리 λ‘λ©μ μ¬μ©νμ¬ μΉμ¬μ΄νΈμ μ΄κΈ° λ·°μ νμν λͺ¨λμ 미리 λ‘λν μ μμ΅λλ€. μ΄λ μΉμ¬μ΄νΈμ μΈμ§λ μ±λ₯μ ν₯μμν€κ³ μΉμ¬μ΄νΈκ° μνΈ μμ©νκ² λλ λ° κ±Έλ¦¬λ μκ°μ μ€μΌ μ μμ΅λλ€.
2. λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)
λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ μ μ½λ λΆν μ μ¬μ©νμ¬ λ€λ₯Έ κ²½λ‘ λλ κΈ°λ₯μ νμμ λ°λΌ λ‘λν μ μμ΅λλ€. μλ₯Ό λ€μ΄ ν νμ΄μ§, μ 보 νμ΄μ§ λ° μ°λ½μ² νμ΄μ§λ₯Ό λ³λμ μ²ν¬λ‘ λ‘λν μ μμ΅λλ€. λμ importsλ μμ μ μΆμ μ²λ¦¬νκΈ° μν λͺ¨λ λλ λ°μ΄ν° μκ°νλ₯Ό νμνκΈ° μν λͺ¨λκ³Ό κ°μ΄ νΉμ κ²½λ‘μλ§ νμν λͺ¨λμ λ‘λνλ λ° μ¬μ©ν μ μμ΅λλ€.
νΈλ¦¬ μμ΄νΉμ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ JavaScript λ²λ€μμ μ¬μ©νμ§ μλ μ½λλ₯Ό μ κ±°ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ νΉμ κ΅¬μ± μμ λλ ν¨μκ° ν κ²½λ‘μμλ§ μ¬μ©λλ κ²½μ° λ€λ₯Έ κ²½λ‘μ λ²λ€μμ μ κ±°ν μ μμ΅λλ€.
미리 λ‘λ©μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ μ΄κΈ° κ²½λ‘μ νμν λͺ¨λμ 미리 λ‘λν μ μμ΅λλ€. μ΄λ μ ν리μΌμ΄μ μ μΈμ§λ μ±λ₯μ ν₯μμν€κ³ μ ν리μΌμ΄μ μ΄ μνΈ μμ©νκ² λλ λ° κ±Έλ¦¬λ μκ°μ μ€μΌ μ μμ΅λλ€.
3. λΌμ΄λΈλ¬λ¦¬ λλ νλ μμν¬
λΌμ΄λΈλ¬λ¦¬ λλ νλ μμν¬λ μ½λ λΆν μ μ¬μ©νμ¬ λ€λ₯Έ μ¬μ© μ¬λ‘μ λν λ€λ₯Έ λ²λ€μ μ 곡ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ λΌμ΄λΈλ¬λ¦¬λ λͺ¨λ κΈ°λ₯μ ν¬ν¨νλ μ 체 λ²λ€κ³Ό νΉμ κΈ°λ₯λ§ ν¬ν¨νλ λ μμ λ²λ€μ μ 곡ν μ μμ΅λλ€.
νΈλ¦¬ μμ΄νΉμ μ¬μ©νμ¬ λΌμ΄λΈλ¬λ¦¬μ JavaScript λ²λ€μμ μ¬μ©νμ§ μλ μ½λλ₯Ό μ κ±°ν μ μμ΅λλ€. μ΄λ λ²λ€ ν¬κΈ°λ₯Ό μ€μ΄κ³ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ μ ν리μΌμ΄μ μ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
λμ importsλ₯Ό μ¬μ©νμ¬ λͺ¨λμ νμμ λ°λΌ λ‘λν μ μμΌλ―λ‘ κ°λ°μλ νμν κΈ°λ₯λ§ λ‘λν μ μμ΅λλ€. μ΄λ μ ν리μΌμ΄μ ν¬κΈ°λ₯Ό μ€μ΄κ³ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
κ³ κΈ κΈ°μ
1. λͺ¨λ νλλ μ΄μ
λͺ¨λ νλλ μ΄μ μ λ°νμμ λ€λ₯Έ μ ν리μΌμ΄μ κ°μ μ½λλ₯Ό 곡μ ν μ μλ Webpack κΈ°λ₯μ λλ€. μ΄λ λ§μ΄ν¬λ‘νλ°νΈμλλ₯Ό ꡬμΆνκ±°λ λ€λ₯Έ ν λλ μ‘°μ§ κ°μ μ½λλ₯Ό 곡μ νλ λ° μ μ©ν μ μμ΅λλ€.
μ:
// webpack.config.js (μ ν리μΌμ΄μ
A)
module.exports = {
// ...
plugins: [
new ModuleFederationPlugin({
name: 'app_a',
exposes: {
'./MyComponent': './src/MyComponent',
},
}),
],
};
// webpack.config.js (μ ν리μΌμ΄μ
B)
module.exports = {
// ...
plugins: [
new ModuleFederationPlugin({
name: 'app_b',
remotes: {
'app_a': 'app_a@http://localhost:3001/remoteEntry.js',
},
}),
],
};
// μ ν리μΌμ΄μ
B
import MyComponent from 'app_a/MyComponent';
μ΄μ μ ν리μΌμ΄μ
Bλ λ°νμμ μ ν리μΌμ΄μ
Aμ MyComponent κ΅¬μ± μμλ₯Ό μ¬μ©ν μ μμ΅λλ€.
2. μλΉμ€ μ컀
μλΉμ€ μ컀λ μΉ λΈλΌμ°μ μ λ°±κ·ΈλΌμ΄λμμ μ€νλλ JavaScript νμΌλ‘, μΊμ± λ° νΈμ μλ¦Όκ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€. λν λ€νΈμν¬ μμ²μ κ°λ‘μ±μ μΊμμμ λͺ¨λμ μ 곡νμ¬ μ±λ₯μ ν₯μμν€κ³ μ€νλΌμΈ κΈ°λ₯μ νμ±ννλ λ° μ¬μ©ν μ μμ΅λλ€.
μ:
// service-worker.js
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => {
return response || fetch(event.request);
})
);
});
μ΄ μλΉμ€ μ컀λ λͺ¨λ λ€νΈμν¬ μμ²μ μΊμνκ³ μ¬μ© κ°λ₯ν κ²½μ° μΊμμμ μ 곡ν©λλ€.
κ²°λ‘
ν¨μ¨μ μ΄κ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μΉ μ ν리μΌμ΄μ μ ꡬμΆνλ €λ©΄ JavaScript import λ¨κ³λ₯Ό μ΄ν΄νκ³ μ μ΄νλ κ²μ΄ νμμ μ λλ€. λμ imports, λͺ¨λ λ²λ€λ¬, νΈλ¦¬ μμ΄νΉ, μ½λ λΆν , import λ§΅ λ° λ―Έλ¦¬ λ‘λ©κ³Ό κ°μ κΈ°μ μ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ μ±λ₯μ ν¬κ² ν₯μμν€κ³ λ λμ μ¬μ©μ νκ²½μ μ 곡ν μ μμ΅λλ€. μ΄ κ°μ΄λμ μ€λͺ λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ λͺ¨λμ΄ ν¨μ¨μ μ΄κ³ ν¨κ³Όμ μΌλ‘ λ‘λλλλ‘ ν μ μμ΅λλ€.
νμ λͺ¨λ λ‘λ© νλ‘μΈμ€μ μ±λ₯μ λͺ¨λν°λ§νκ³ κ°μ ν μμμ μλ³νμμμ€. μΉ κ°λ° νκ²½μ λμμμ΄ μ§ννκ³ μμΌλ―λ‘ μ΅μ κΈ°μ λ° κΈ°μ μ μ΅μ μνλ‘ μ μ§νλ κ²μ΄ μ€μν©λλ€.